package page;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import ressource.CadreAnnonce;
import ressource.CadreMembre;
import ressource.CadreProduit;
import ressource.CadreVente;
import ressource.Message;

/**
 * Servlet implementation class VueAcheter
 */
public class VueAcheter extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public VueAcheter() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis;
		Connection con = null;
		Context namingContext = null;
		DataSource dataSource = null;
		
		//Si je ne suis pas connecté alors je suis redirigé
		Integer membre = (Integer)session.getAttribute("user_id");
		if(membre == null){
			dis = request.getRequestDispatcher("/login.jsp");
			dis.forward(request, response);
			return;
		}
		
		//Qu'est ce que je dois faire sur cette page ?
		String action = request.getParameter("action");
		
		//Si je dois juste afficher la vente, on prend l'id et on fait le traitement plus tard :
		int id_vente = 0;
		if(action != null && action.equals("voir_transaction"))
		{
			if(request.getParameter("vente") == null) {
				dis = request.getRequestDispatcher("/login.jsp");
				dis.forward(request, response);
				return;
			}
			else
				id_vente = Integer.parseInt(request.getParameter("vente"));
		}

		//Est ce que l'on doit créer une vente ?
		if(action.equals("newachat")) {
			//Pour quelle annonce doit on créer une vente ?
			String idAnnonce = request.getParameter("annonce");
			if(idAnnonce != null) {
				try {
				//COnnexion à la bdd :
				namingContext = new InitialContext();
				dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
				con = dataSource.getConnection();
				
				//Est ce qu'il y avait bien le stock nécessaire pour la vente ?
				PreparedStatement testStock=con.prepareStatement("SELECT stock, prix FROM annonce WHERE id_annonce = ?");
				testStock.setInt(1, Integer.parseInt(idAnnonce));
				ResultSet rs = testStock.executeQuery();
				Integer prix = 0;
				if(rs.next()) {
					prix = rs.getInt("prix"); 
					if(rs.getInt("stock") < 1) {
						//Pas de sotck, donc je redirige
						response.sendRedirect("Annonce?annonce="+idAnnonce);
						return;
					}
				}
				testStock.close();
				
				String quantite = request.getParameter("quantite");
				//On crée une vente :
				PreparedStatement pstmt=con.prepareStatement("INSERT INTO vente (id_acheteur, id_annonce, stock, prix) VALUES (?,?,?,?)", new String[] {"id_vente"});
				pstmt.setInt(1, membre);
				pstmt.setInt(2, Integer.parseInt(idAnnonce));
				pstmt.setInt(3, Integer.parseInt(quantite));
				pstmt.setInt(4, prix);
				pstmt.executeUpdate();
				rs = pstmt.getGeneratedKeys();
				
				if(rs.next()) {
					id_vente = rs.getInt(1);
				}
				
				//On décrémente le stock :
				PreparedStatement decrementeStock=con.prepareStatement("UPDATE annonce SET stock = stock - ? WHERE id_annonce = ?");
				decrementeStock.setInt(1, Integer.parseInt(idAnnonce));
				decrementeStock.setInt(2, Integer.parseInt(quantite));
				decrementeStock.executeUpdate();
				
				//Et l'action suivante sera :
				action = "voir_transaction";
				} catch (SQLException e) {
					System.out.println(e);
					e.printStackTrace();
				} catch (Exception e) {
					System.out.println(e);
					e.printStackTrace();
				} finally {
					try {
						con.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			} else {
				System.out.println("Une annonce doit être choisie");
			}
		}
		
		//Si on doit afficher une transaction :
		if(action.equals("voir_transaction")) {
			//Est ce qu'on a le bon type de vente ?
			if(id_vente == 0) {
				dis = request.getRequestDispatcher("/login.jsp");
				dis.forward(request, response);
				return;
			}
			
			//Ok tout est checké on commence donc :
			try {
				Integer vendeurId = 0;
				
				//Connexion à la bdd
				namingContext = new InitialContext();
				dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
				con = dataSource.getConnection();
				
				//Primo les infos sur le vendeur, l'acheteur, le produit et l'annonce :
				PreparedStatement pstmt=con.prepareStatement("SELECT ac.id_membre as id_acheteur, ac.pseudo as pseudo_acheteur, ac.avatar as avatar_acheteur, ac.nom as nom_acheteur, ac.prenom as prenom_acheteur, ac.numero_rue as num_rue_acheteur, ac.rue as rue_acheteur, ac.code_postal as code_acheteur, ac.ville as ville_acheteur, ac.telephone as telephone_acheteur, ac.mail as mail_acheteur, ac.date_naissance as naissance_acheteur,  v.id_membre as id_vendeur, v.pseudo as pseudo_vendeur, v.avatar as avatar_vendeur, v.nom as nom_vendeur, v.prenom as prenom_vendeur, v.numero_rue as num_rue_vendeur, v.rue as rue_vendeur, v.code_postal as code_vendeur, v.ville as ville_vendeur, v.telephone as telephone_vendeur , v.mail as mail_vendeur, v.date_naissance as naissance_vendeur, t.nom as type_produit, t.id_type, p.intitule, p.id_produit, p.description, p.photo, a.id_annonce, a.etat, a.prix, a.date_creation, a.date_expiration, a.commentaire, ve.id_vente, ve.note as note_vente, ve.date as date_vente, ve.prix as prix_vente, ve.commentaire as commentaire_vente, ve.stock FROM vente ve, membre v, membre ac, annonce a, produit p, type_produit t WHERE ve.id_vente = ? AND ve.id_acheteur = ac.id_membre AND ve.id_annonce = a .id_annonce AND a.id_produit = p.id_produit AND p.id_type = t.id_type AND a.id_vendeur = v.id_membre");
				pstmt.setInt(1, id_vente);
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) {
					//On crée nos objets à transmettre au .jsp :
					CadreMembre acheteur = new CadreMembre();
					CadreMembre vendeur = new CadreMembre();
					CadreProduit produit = new CadreProduit();
					CadreAnnonce annonce = new CadreAnnonce();
					CadreVente vente = new CadreVente();
					
					//Premièrement les informations sur l'acheteur :
					acheteur.setAvatar(rs.getString("avatar_acheteur"));
					acheteur.setCodePostal(rs.getInt("code_acheteur"));
					acheteur.setIdMembre(rs.getInt("id_acheteur"));
					acheteur.setMail(rs.getString("mail_acheteur"));
					acheteur.setNom(rs.getString("nom_acheteur"));
					acheteur.setPrenom(rs.getString("prenom_acheteur"));
					acheteur.setPseudo(rs.getString("pseudo_acheteur"));
					acheteur.setRue(rs.getString("rue_acheteur"));
					acheteur.setNumRue(rs.getInt("num_rue_acheteur"));
					acheteur.setTelephone(rs.getInt("telephone_acheteur"));
					acheteur.setVille(rs.getString("ville_acheteur"));
					request.setAttribute("acheteur", acheteur);
					
					//Deuxièmement les informations sur l'vendeur :
					vendeur.setAvatar(rs.getString("avatar_vendeur"));
					vendeur.setCodePostal(rs.getInt("code_vendeur"));
					vendeur.setIdMembre(rs.getInt("id_vendeur"));
					vendeurId = rs.getInt("id_vendeur");
					vendeur.setMail(rs.getString("mail_vendeur"));
					vendeur.setNom(rs.getString("nom_vendeur"));
					vendeur.setPrenom(rs.getString("prenom_vendeur"));
					vendeur.setPseudo(rs.getString("pseudo_vendeur"));
					vendeur.setRue(rs.getString("rue_vendeur"));
					vendeur.setNumRue(rs.getInt("num_rue_vendeur"));
					vendeur.setTelephone(rs.getInt("telephone_vendeur"));
					vendeur.setVille(rs.getString("ville_vendeur"));
					request.setAttribute("vendeur", vendeur);
					
					//Troisièmement les informations sur le produit :
					produit.setId(rs.getInt("id_produit"));
					produit.setDescription(rs.getString("description"));
					produit.setIntitule(rs.getString("intitule"));
					produit.setPhoto(rs.getString("photo"));
					produit.setType("type_produit");
					request.setAttribute("produit", produit);
					
					//Quatrièmement les informations sur l'annonce :
					annonce.setIdAnnonce(rs.getInt("id_annonce"));
					annonce.setCommentaire(rs.getString("commentaire"));
					annonce.setDateExpiration(rs.getDate("date_creation"));
					annonce.setEtat(rs.getString("etat"));
					annonce.setPrix(rs.getFloat("prix"));
					request.setAttribute("annonce", annonce);

					//Et pour finir les informations sur la vente :
					vente.setIdVente(id_vente);
					vente.setCommentaire(rs.getString("commentaire_vente"));
					vente.setDate(rs.getDate("date_vente"));
					vente.setNote(rs.getFloat("note_vente"));
					vente.setPrix(rs.getInt("prix_vente"));
					vente.setStock(rs.getInt("stock"));
					request.setAttribute("vente", vente);
				}
				pstmt.close();
				
				//Maintenant nous gérons le dialogue autour de la vente si il y en a un :
				pstmt=con.prepareStatement("SELECT u.avatar, m.id_message, m.date, m.message, u.pseudo, u.id_membre FROM message_vente m, membre u WHERE m.id_vente = ? AND m.id_membre = u.id_membre ORDER BY m.date ASC");
				pstmt.setInt(1, id_vente);
				
				rs = pstmt.executeQuery();
				
				//Les objets qui vont nous servir :
				Message m;
				List<Message> messages = new ArrayList<Message>();
				while(rs.next()) {
					m = new Message();
					m.setDate(rs.getTimestamp("date"));
					m.setMessage(rs.getString("message"));
					m.setPseudoMembre(rs.getString("pseudo"));
					m.setIdAuteur(rs.getInt("id_membre"));
					m.setIdMessage(rs.getInt("id_message"));
					m.calculeCouleur(vendeurId);
					m.setAvatarMembre(rs.getString("avatar"));
					messages.add(m);
				
					//Est ce que ce message est déjà noté comme lu ?
					PreparedStatement testLu = con.prepareStatement("SELECT id_message FROM message_vente_vu WHERE id_message = ? AND id_membre = ?");
					testLu.setInt(1, rs.getInt("id_message"));
					testLu.setInt(2, membre);
					ResultSet resultTestLu = testLu.executeQuery();
					if(!resultTestLu.next()) {
						//Ajoutons les messages non lus aux messages lus :
						PreparedStatement setLu = con.prepareStatement("INSERT INTO message_vente_vu (id_message, id_membre) VALUES (?,?)");
						setLu.setInt(1, rs.getInt("id_message"));
						setLu.setInt(2, membre);
						setLu.executeUpdate();
						setLu.close();
					}
				}
				request.setAttribute("messages", messages);
			} catch (SQLException e) {
				System.out.println(e);
				e.printStackTrace();
			} catch (Exception e) {
				System.out.println(e);
				e.printStackTrace();
			} finally {
				try {
					if(con != null) con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			//On redirige vers la page jsp :
			dis=request.getRequestDispatcher("vente.jsp");
			dis.forward(request,response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
